package com.qf.eduadmin.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.eduadmin.mapper.TbRoleDao;
import com.qf.eduadmin.pojo.req.TbPerReq;
import com.qf.eduadmin.pojo.req.TbRolePermissionReq;
import com.qf.eduadmin.pojo.req.TbRoleReq;
import com.qf.eduadmin.pojo.resp.ResponseData;
import com.qf.eduadmin.pojo.vo.TbRolePermission;
import com.qf.eduadmin.pojo.resp.TbUserRoleResp;
import com.qf.eduadmin.pojo.resp.TreeResp;
import com.qf.eduadmin.pojo.vo.TbRole;
import com.qf.eduadmin.service.TbRoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * (TbRole)表服务实现类
 *
 * @author makejava
 * @since 2021-12-27 20:13:46
 */
@Service
public class TbRoleServiceImpl implements TbRoleService {
    @Resource
    private TbRoleDao tbRoleDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public TbRole queryById(Integer id) {
        return this.tbRoleDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param page 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public ResponseData queryAllByLimit(Integer page,Integer limit) {
        PageHelper.startPage(page,limit);
        List<TbRole> tbRoles = tbRoleDao.queryAllByLimit();
        PageInfo<TbRole> of = PageInfo.of(tbRoles);
        if(tbRoles.size()>0){
            return new ResponseData(0,"查询成功",of.getList(),of.getTotal());
        }
        return new ResponseData(1,"查询失败",null,null);
    }

    /**
     * 新增数据
     *
     * @param tbRoleReq 实例对象
     * @return 实例对象
     */
    @Override
    public ResponseData insert(TbRoleReq tbRoleReq) {
        //使用Utils进行对象之间的属性copy,属性名相同
        TbRole tbRole = new TbRole();
        BeanUtils.copyProperties(tbRoleReq,tbRole);
        Integer insert = tbRoleDao.insert(tbRole);
        if(insert!=null){
            return new ResponseData(0,"添加成功",null,null);
        }
        return new ResponseData(1,"添加失败",null,null);
    }

    /**
     * 修改数据
     *
     * @param tbRole 实例对象
     * @return 实例对象
     */
    @Override
    public TbRole update(TbRole tbRole) {
        this.tbRoleDao.update(tbRole);
        return this.queryById(tbRole.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public ResponseData deleteById(Integer id) {
        Integer integer = tbRoleDao.deleteById(id);
        if (integer!=null){
            return new ResponseData(0,"删除成功",null,null);
        }
        return null;
    }

    /**
     * 更新角色
     * @param tbRolePermissionReq
     * @return
     */
    @Override
    public ResponseData updatePermission(TbRolePermissionReq tbRolePermissionReq) {
        //1.删除中间表中的角色与权限的关系
        Integer i = tbRoleDao.deleteByRoleid(tbRolePermissionReq.getRoleid());
        //2.建立新的角色与权限的逻辑关系
        if(i!=null){
            List<TbPerReq> perlist = tbRolePermissionReq.getPerlist();
            if(perlist.size()>0){
                List<TbRolePermission> list = new ArrayList<>();
                for(TbPerReq tbPerReq : perlist){
                    TbRolePermission tbRolePermission = new TbRolePermission();
                    tbRolePermission.setPermissionid(tbPerReq.getId());
                    tbRolePermission.setRoleid(tbRolePermissionReq.getRoleid());
                    tbRolePermission.setPermissionName(tbPerReq.getPermissionname());
                    list.add(tbRolePermission);
                }
                Integer integer = tbRoleDao.savaAll(list);
                if(integer!=null){
                    return new ResponseData(0,"授权成功",null,null);
                }
            }
        }
        return new ResponseData(1,"授权失败",null,null);
    }

    /**
     * 查询所有用户角色
     * @param userId
     * @return
     */
    @Override
    public ResponseData findRoleByUserId(Integer userId) {
        List<TbUserRoleResp> roles = tbRoleDao.findRoleByUserId(userId);
        List<TreeResp> list = new ArrayList<>();
        for(TbUserRoleResp userRoles : roles){
            TreeResp treeResp = new TreeResp();
            if(userRoles.getUserid()!=null){
                treeResp.setChecked(true);
            }
            treeResp.setId(userRoles.getId());
            treeResp.setTitle(userRoles.getRoleName());
            list.add(treeResp);
        }
        return new ResponseData(0,"查询成功",list,null);
    }
}